package com.exercise.poly_.detail_;

public class PolyDetail {
    public static void main(String[] args) {
        //向上转型:父类的引用指向了子类的对象
        Animal animal = new Cat();
        //可以调用父类中的所有成员(需要遵守访问权限)
        animal.eat();
        animal.run();
        animal.show();
        animal.sleep();

        //调用过程中，规则跟之前一致(就近原则)
        animal.eat();//因为当前的运行类型是Cat，并且Cat的子类中有eat方法，所以会优先调用Cat的eat方法
        //但是不能调用子类的特有成员，因为在调用的时候，
        // 会先进行编译，在编译阶段，左边是Animal，所以只能调用父类中有的对象
        //animal.play();err,因为父类中没有play方法，在编译的过程中无法通过

        //如果非要调用子类的成员，可以使用向下转型
        //语法：子类类型 引用名 = (子类类型) 父类引用
        //只能强转父类引用，不能强转父类的对象
        //要求父类的引用必须指向的是当前目标类型的对象
        //向下转型后，可以调用子类类型中的所有成员
        Cat cat = (Cat) animal;
        cat.play();
        System.out.println(cat.count);
    }
}
